package com.iflytek.ci.cpms.service;

import com.iflytek.ci.cpms.domain.Milestone;
import com.iflytek.ci.cpms.dto.MilestoneReport;
import com.iflytek.framework.pagination.PaginationCriteria;
import com.iflytek.framework.pagination.PaginationResult;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 里程碑配置服务接口
 * </p>
 * 
 * @author mdzhang
 * 
 */
public interface MilestoneService {
	/**
	 * 添加新的里程碑
	 * 
	 * @param milestone
	 */
	void add_new(Milestone milestone);

	/**
	 * 删除一个里程碑
	 * 
	 * @param id
	 *            里程碑id
	 */
	void delete_with_id(long id);

	/**
	 * 删除一个项目里的全部里程碑
	 * 
	 * @param id
	 *            里程碑id
	 */
	void delete_with_project(long id);

	/**
	 * 获取某一个里程碑
	 * 
	 * @param id
	 *            里程碑id
	 * @return Milestone信息
	 */
	Milestone get_milestone_id(long id);

	/**
	 * 获取某一个项目的所有里程碑
	 * 
	 * @param p_id
	 *            项目id
	 * @return 里程碑列表
	 */
	List<Milestone> get_milestones_project(long p_id);

	/**
	 * 更新项目里程碑
	 * 
	 * @param milestone
	 */
	void update_milestone(Milestone milestone);

	/**
	 * 高级里程碑查询 可以通过多个条件联合查询（项目ID、开始时间、结束时间）
	 * 
	 * @param projectId
	 *            项目id此参数是必须要传递的
	 * @param params
	 *            Map<String,Object> 查询条件 params Key : name ：里程碑名称 starttime
	 *            ：里程碑开始时间 duetime ：里程碑结束时间
	 * @throws Exception
	 *             如果项目ID没有设置，则会抛出无项目异常 供前台控制器捕获
	 */
	List<Milestone> milestones_advanced_query(long projectId,
			Map<String, Object> params);

	/**
	 * 设置达到里程碑
	 * 
	 * @param desciption
	 *            里程碑达到的描述信息
	 * @param id
	 *            里程碑id
	 */
	void set_milestone_reach(String desciption, long id);

	/**
	 * 获取某项目的所有里程碑，如果项目id为0则显示所有
	 * 
	 * @param criteria
	 *            分页信息
	 * @param project_id
	 *            项目id
	 * @return 里程碑分页
	 */
	PaginationResult<Milestone> get_milestone(PaginationCriteria criteria,
			long project_id);

	/**
	 * 通过批量项目id删除里程碑信息
	 * 
	 * @param p_ids
	 *            多个项目id
	 */
	void remove_milestone_pids(String[] p_ids);

	/**
	 * 批量删除里程碑信息
	 * 
	 * @param ids
	 *            多个里程碑id
	 */
	boolean remove_milestone_ids(long[] ids);

	/**
	 * 添加里程碑的反馈信息数量
	 * 
	 * @param milestone_id
	 *            里程碑的id
	 * @param ids
	 *            反馈信息id构成的数组
	 */
	void update_milestone_counts(long milestone_id, long[] ids);

	/**
	 * 获取所有里程碑的id和name信息
	 * 
	 * @return 里程碑列表
	 */
	List<Milestone> all_milestone();

	/**
	 * 更新里程碑的分类信息数量
	 * 
	 * @param ids
	 *            反馈信息id
	 * @param status
	 *            状态值，为1代表关闭，为0代表重新打开
	 */
	void cate_count_update(long[] ids, int status);

	/**
	 * 发送里程碑报告
	 * 
	 * @param milestoneReport
	 *            里程碑报告dto对象（包含要报告信息、发送对象等）
	 */
	void send_milestone_report(MilestoneReport milestoneReport);

	/**
	 * 导入问题
	 * 
	 * @param upload_file
	 *            导入的文件
	 */
	String issue_import(MultipartFile upload_file);
}
